/*
 * exemplo_psit_basico.c: exemplo de uso da biblioteca psit para criação
 * de duas threads independentes. Este exemplo é semelhante ao
 * exemplo_tempo_swap, mas não há um limite de tempo. Ao invés disso,
 * cada thread executaria até atingir um certo valor.
 */
#include <stdio.h>     /* fprintf */
#include <stdlib.h>    /* exit */
#include "psit.h" 
#include "kill_time.h" 

/* A função a ser executada pelas threads é uma só,
 * mas recebe como parâmetro um
 * identificador que será usado para diferenciá-la. Para tornar essa
 * diferenciação mais fácil, a evolução do contador depende do índice.
 * Neste caso, a função não executa explicitamente a troca de contexto,
 * como era o caso em exemplo_swap-2. Essa tarefa agora é do tratador de
 * sinais de temporização.
 */
void last_thread(int index) {
	int cnt = 0;
	int limit = 15 * (4 + index);
	fprintf(stderr, "thread KILLER\n");
	fprintf(stderr, "thread(%d): início\n", index);
	while (1) {
		for (cnt = 0; cnt < limit; cnt += (2 + index)) {
			fprintf(stderr, "thread ultima (%d) esta executando... (%d)\n",
					index, cnt);
			kill_time();
			fprintf(stderr, "thread ultima (%d): retornando\n", index);
			break;

		}
	}
	fprintf(stderr, "thread(%d): retornando\n", index);
}
void thread_code(int index) {
	int cnt = 0;
	int limit = 15 * (4+ index);
	fprintf(stderr, "Esta thread (%d) termina ao atingir %d.\n", index, limit);
	printf(stderr,"thread(%d): início\n", index);

	for (cnt = 0; cnt < limit; cnt += (2 + index)) {
		fprintf(stderr, "thread(%d) esta executando... (%d)\n", index, cnt);
		kill_time();
	}
	fprintf(stderr,"thread(%d): retornando\n", index);
}

int main(int argc, char* argv[]) {
	int i;

	psit_init();

	fprintf(stderr, "main: vai criar as threads, que começam a executar\n");
	//psit_thread_create(last_thread, 0);
	for (i = 0; i < 9; ++i) {
		psit_thread_create(thread_code, i);
	}
	fprintf(stderr, "main: threads criadas, vai esperar pelo seu término\n");
	psit_wait_threads();

	printf("main: executando; isso quer dizer que threads terminaram.\n");
	printf("main: terminando\n");
	exit(EXIT_SUCCESS);
}
